<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

define('PATH_TO_TEMPLATE', dirname(FCPATH).'/templates/');

/**
 * Template Class
 *
 * @package		CodeIgniter
 * @subpackage	Libraries
 * @category	Template
 * @author		Ladygin Sergey (webcoderu@gmail.com)
 * @version     0.1
 */
class Template {
	
	/*
	 * Массив с переменными для передачи в шаблон
	 */
	private $data = array();
	
	/*
	 * Название шаблона
	 */
	private $global_template = 'default/';
	
	/*
	 * Путь до шаблона
	 */
	private $path = 'templates/';
	
	/*
	 * Разделитель сегментов для загаловка
	 */
	private $title_separator = ' | ';
	
	/*
	 * Направление загаловка
	 */
	private $title_direction = 'LTR';
	
	/*
	 * Занятые имена переменных
	 */
	private $valide_string = array('head', 'block');
	
	/*
	 * CodeIgniter object
	 */
	private $_CI;
	
	static $_global_template;
	
	function Template($params = array()) {
		
		//Загружаем настройки
		$this->initialize($params);
		
		//Инициируем суперобъект
		$this->_CI =& get_instance();
		
		//Загружаем необходимые хелперы
		$this->_CI->load->helper('html');
		
		log_message('debug', "Template Class Initialized");
	}
	
	/*
	 * Вывод информации
	 * Вызывается в конце метода контроллера (когда необходимо вывести результат).
	 * 
	 * @params $main string имя шаблона для контента
	 */
	public function render($main='content') {
		
	    $this->data['base_header'] = ' ';
		$this->refresh_global_vars();
	    
		//Обработка загаловков
		if (isset($this->data['head']['title']) && count($this->data['head']['title']) > 0) {
			
			if ($this->title_direction == 'RTL') {
				
				krsort($this->data['head']['title']);
			}
			
			$this->data['base_title'] = implode($this->title_separator, $this->data['head']['title']);
		}
		
		//Обработка метаинформации
		if (isset($this->data['head']['meta']) && count($this->data['head']['meta']) > 0) {
			
			$this->data['base_header'] .= meta($this->data['head']['meta']);
		}
		
		//Оюрабтка feed
		if (isset($this->data['head']['feed']) && count($this->data['head']['feed']) > 0) {
			
			foreach($this->data['head']['feed'] as $row) {
				
				$this->data['base_header'] .= link_tag($row);
			}
		}
		
		//Обработка Js
		if (isset($this->data['head']['js']) && count($this->data['head']['js']) > 0) {
			
			foreach($this->data['head']['js'] as $row) {
				
				$this->data['base_header'] .= '<script type="text/javascript" src="'.$this->_CI->config->slash_item('base_url').$row.'"></script>';
			}
		}
		
		//Обработка css
		if (isset($this->data['head']['css']) && count($this->data['head']['css']) > 0) {
			
			foreach($this->data['head']['css'] as $row) {
				
				$this->data['base_header'] .= link_tag($row);
			}
		}
		
		unset($this->data['head']);
	    $this->_CI->load->vars($this->data);
	    
		$this->_CI->load->view('header');
		$this->_CI->load->view($main);
		$this->_CI->load->view('footer');
	}
	
	public function initialize($params = array()) {
	    
	   if (count($params) > 0)    {
            
            foreach ($params as $key => $val) {
                
                if (isset($this->$key)) {
                    
                    $this->$key = $val;
                }
                elseif($key == 'vars_default') {
                    
                    $this->data = $val;
                }
                else {
                    
                    $this->data[$key] = $val;
                }
            }
        }
        
        self::$_global_template = $this->global_template;
	}
	
	/*
	 * Создание переменной для отображения
	 * 
	 * @params $name string имя переменной
	 * @params $value mixed значение переменной
	 */
	public function set($name, $value = ' ') {
		
		if (!$this->valide_string_name($name)) {
			
			return false;
		}
		
		$this->data[$name] = $value;
		return true;
	}
	
	/*
	 * Изменяет глобальный шаблон страницы.
	 * 
	 * @param $name string имя шаблона
	 */
	public function set_template($name) {
		
		self::$_global_template = $this->global_template = $name.'/';
		
		$this->refresh_global_vars();
		return true;
	}
	
	/*
	 * Создание блока на странице, который можно в любой момент продолжить указав его имя.
	 * 
	 * @param $name string имя блока
	 * @param $value string содержимое блока
	 */
	public function set_block($name, $value = ' ') {
		
		if (isset($this->data['block'][$name])) {
			
			$this->data['block'][$name] .= $value;
		}
		else {
			
			$this->data['block'][$name] = $value;
		}
		
		return true;
	}
	
	/*
	 * Создание блока на странице из файла, который можно в любой момент продолжить указав его имя.
	 * 
	 * @param $name string имя блока
	 * @param $file_name string имя файла из папки /blocks/
	 * @param $vars array данные для передачи в вид
	 */
	public function set_block_view($name, $file_name, $vars = array()) {
		
	    if (file_exists(PATH_TO_TEMPLATE.$this->global_template.'blocks/widget_'.$file_name.'.php')) {
	        
	        $file_name = 'widget_'.$file_name;
	    }
	    else {
	        
	        $file_name = 'widget';
	    }
	    
	    $result = $this->view('blocks/'.$file_name, $vars);
	    
		if (isset($this->data['block'][$name])) {
			
			$this->data['block'][$name] .= $result;
		}
		else {
			
			$this->data['block'][$name] = $result;
		}
		
		return $result;
	}
	
	/*
	 * Получение блока созданного ранее
	 * 
	 * @param $name string имя блока
	 */
	public function get_block($name) {
		
		if (isset($this->data['block'][$name])) {
			
			return $this->data['block'][$name];
		}
		
		return false;
	}
	
	/*
	 * Добавление сегмента в загаловок страницы
	 * 
	 * @param $title string содержимое сегмента
	 */
	public function set_title($title) {
		
		$this->data['head']['title'][] = $title;
		return true;
	}
	
	/*
	 * Установка метаданных для страницы
	 * 
	 * @param $name string имя метатэга
	 * @param $content string значение метатэга
	 */
	public function set_meta($name, $content, $type = 'name') {
		
		$this->data['head']['meta'][] = array('name' => $name, 'content' => $content, 'type' => $type);
		return true;
	}
	
	/*
	 * Добавление фида на страницу
	 * 
	 * @param $link string ссылка на фид
	 */
	public function set_feed($href, $title = '',  $rel='alternate', $type = 'application/rss+xml') {
		
		$this->data['head']['feed'][] = array(
          'href' 	=> $href,
          'rel' 	=> $rel,
          'type' 	=> $type,
          'title' 	=> $title
		);
		
		return true;
	}
	
	/*
	 * Подключение css файла на страницу
	 * 
	 * @param $href string ссылка на css файл
	 */
	public function set_css($href, $rel='stylesheet', $type = 'text/css', $media = '') {
		
		$this->data['head']['css'][] = array(
          'href' 	=> $this->path.$this->global_template.$href,
          'rel' 	=> $rel,
          'type' 	=> $type,
          'media' 	=> $media
		);
		
		return true;
	}
	
	/*
	 * Подключение js файла на страницу
	 * 
	 * @param $link string ссылка на js файл
	 */
	public function set_js($link) {
		
		$this->data['head']['js'][] = $this->path.$this->global_template.$link;
		return true;
	}
	
	/*
	 * Загрузка файла вида
	 * 
	 * @param $view string путь до подключаемого файла
	 * @param $vars array данные для передачи в вид
	 */
	public function view($view, $vars = array(), $return = true) {
		
		return $this->_CI->load->view($view, $vars, $return);
	}
	
	public function get_base_path() {
	    
	    return $this->_CI->config->slash_item('base_url').$this->path.$this->global_template;
	}
		
	/*
	 * Проверяем не занята ли переменная
	 * 
	 * @param $name string имя проверяемой переменной
	 */
	private function valide_string_name($name) {
		
		return (in_array($name, $this->valide_string)) ? false : true;
	}
	
	private function refresh_global_vars() {
	    
        $data['base_url'] = $this->_CI->config->slash_item('base_url');
        $data['base_path'] = $this->_CI->config->slash_item('base_url').$this->path.$this->global_template;
        
        $this->_CI->load->vars($data);
	}
}